//Esta clase permite evaluar los cromosomas para conocer sus aptitudes dentro de la poblacion
//y asi poder decidir si se cruzaran, mutaran, o quedaran igual.
package mx.unam.ia.algoritmos;

/**
 *
 * @author Juan Fco. Navarrete
 */

public class EvaluadorCromosomas
{    
    private double constante;
    private double x[];
    private double y[];

    public EvaluadorCromosomas(double constante, double[] x, double[] y)
    {        
        this.constante = constante;
        this.x = x;
        this.y = y;
    }

    public double getConstante() //Se obtiene una constante
    {
        return constante;
    }

    public void setConstante(double constante) //Se feine una constante de tipo "double"
    {
        this.constante = constante;
    }

    public double[] getX() //Se obtiene un valor de X
    {
        return x;
    }

    public void setX(double[] x) //Se establece un valor de X
    {
        this.x = x;
    }

    public double[] getY() //Se obtiene un valor de Y
    {
        return y;
    }

    public void setY(double[] y) //Se establece un valor de y
    {
        this.y = y;
    }


//    Se define la funcion para evaluar los cromosomas:
//    La sumatoria de la diferencia  absoluta del valor
//    esperado menos el valor obtenido con la ecuacion creada.
//    Y se aplica a cada cromosoma.
    public void evaluarCromosoma(Cromosoma cromosoma)
    {
        double sumatoria = 0;
        for (int i = 0; i < x.length; i++)
        {            
            double obtenido = cromosoma.getArbol().evaluar(x[i], constante);
            if(Double.isNaN(obtenido) || Double.isInfinite(obtenido))
                obtenido = 500000;
            double evaluacion = Math.abs(y[i] - obtenido);                        
            sumatoria += evaluacion;
        }
        cromosoma.setEvaluacion(sumatoria);
    }

    //Se obtienen la relacion x, y de los valores obtenidos.
    public double[] obtenerPuntos(Cromosoma cromosoma)
    {
        double[] obtenidos = new double[x.length];
        for (int i = 0; i < x.length; i++)
        {
            obtenidos[i] = cromosoma.getArbol().evaluar(x[i], constante);
        }
        return obtenidos;
    }
}
